import { defineStore } from 'pinia';
import { ref } from 'vue';

// ---------------------- 调整：User 接口所有字段改为可选（允许空对象 {}） ----------------------
interface User {
  username?: string;       // 改为可选
  token?: string | null;   // 改为可选
  id?: number;             // 改为可选
  nickname?: string;       // 可选：昵称
  mobile?: string;         // 可选：手机号（原“必填”改为可选）
  avatar?: string;         // 可选：头像
  score?: number;          // 可选：积分（默认 0）
  user_id?: number;        // 可选：用户 ID
  createtime?: number;     // 可选：创建时间戳（默认 0）
  expiretime?: number;     // 可选：过期时间戳（默认 0）
  expires_in?: number;     // 可选：过期时长（默认 0）
  store_id?: number;       // 可选：店铺 ID（默认 0）
}

export const useUserStore = defineStore('user', () => {
  // ---------------------- 初始化逻辑：从 Storage 读取，无则为空对象 {} ----------------------
  const storedUserStr = uni.getStorageSync('userinfo'); // 读取 Storage 字符串
  const initUserinfo = storedUserStr 
    ? JSON.parse(storedUserStr) 
    : {}; // 无则初始化为空对象（不再是 null）

  // Pinia 状态：初始化为 initUserinfo（空对象或解析后的用户信息）
  const userinfo = ref<User>(initUserinfo); // 直接用空对象初始化，类型符合 User

  // ---------------------- 登录方法：更新状态 + 存储 ----------------------
  const login = (rawUserinfo: any) => {
    return new Promise<void>((resolve) => {
      // 1. 兼容字符串/对象格式的用户信息
      const rawUser = typeof rawUserinfo === 'string' ? JSON.parse(rawUserinfo) : rawUserinfo;
      
      // 2. 转换为符合 User 接口的对象（填充默认值，可选字段保留）
      const userData: User = {
        username: rawUser.username || '',
        token: rawUser.token || null,
        id: rawUser.id || undefined, // 改为可选，无则不填
        nickname: rawUser.nickname || undefined,
        mobile: rawUser.mobile || undefined,
        avatar: rawUser.avatar || undefined,
        score: rawUser.score || undefined,
        user_id: rawUser.user_id || undefined,
        createtime: rawUser.createtime || undefined,
        expiretime: rawUser.expiretime || undefined,
        expires_in: rawUser.expires_in || undefined,
        store_id: rawUser.store_id || undefined,
      };

      // 3. 同步存储到 localStorage
      uni.setStorageSync('userinfo', JSON.stringify(userData));
      
      // 4. 更新 Pinia 状态（响应式生效，无需刷新页面）
      userinfo.value = userData;

      uni.showToast({ title: '登录成功', icon: 'success' });
      resolve();
    });
  };

  // ---------------------- 登出方法：清除状态 + 存储 ----------------------
  const logout = () => {
    return new Promise<void>((resolve) => {
      userinfo.value = {}; // 清除为 空对象（而非 null，保持类型一致）
      uni.removeStorageSync('userinfo');
      uni.showToast({ title: '已登出', icon: 'none' });
      resolve();
    });
  };

  return { userinfo, login, logout };
});